#include <iostream>  
#include <stack>  
using namespace std;  
  
const int MAXN = 100;  
int n;  
int col[MAXN], // 列的颜色，0表示白色，1表示黑色  
    queen[MAXN], // 皇后所在的行号  
    stk[MAXN]; // 用于回溯的栈  
  
// 判断第i行第j列是否可以放置皇后  
bool can(int i, int j) {  
    for (int k = 0; k < i; k++) { // 检查同一列是否已经放置了皇后  
        if (queen[k] == j) return false;  
    }  
    for (int k = 0, l = 0; k < i; k++, l++) { // 检查左上方对角线是否已经放置了皇后  
        if (queen[k] - k == j - l && (k > 0 || l > 0)) return false;  
    }  
    for (int k = 0, l = 0; k < i; k++, l++) { // 检查右上方对角线是否已经放置了皇后  
        if (queen[k] + k == j + l && (k > 0 || l > 0)) return false;  
    }  
    return true;  
}  
  
// 求解n皇后问题  
void solve(int row) {  
    if (row == n) { // 如果已经放置了n个皇后，输出结果并返回  
        for (int i = 0; i < n; i++) {  
            cout << "Q ";  
        }  
        cout << endl;  
        return;  
    }  
    for (int i = 0; i < n; i++) { // 枚举每一列，尝试放置皇后  
        if (can(row, i)) { // 如果可以放置皇后，将该列和下一行的皇后位置入栈，并继续搜索下一行  
            queen[row] = i;  
            stk[row] = col[i]; // 记录当前列的颜色，以便后续判断是否需要翻转颜色  
            col[i] = 1 - col[i]; // 翻转当前列的颜色，表示已经放置了一个皇后  
            solve(row + 1); // 继续搜索下一行  
            col[i] = stk[row]; // 恢复当前列的颜色，以便回溯到上一层  
        }  
    }  
}  
  
int main() {  
    cin >> n; // 输入n皇后问题的规模n  
    solve(0); // 从第0行开始求解n皇后问题  
    return 0;  
}